Podprogramy

python.edumach.cz

Při kreslení složitějších obrázků se náš program stává nepřehledným, protože obsahuje velké množství příkazů. Použití komentářů nám pomůže program zpřehlednit.

Dalším způsobem je použití podprogramu. Jedná se o menší část programu, kterou pojmenujeme, a když ji chceme použít, stačí v programu zadat jeho název. V podstatě tak vytváříme vlastní příkazy, které můžeme v programu použít. Odborně se takovým podprogramům v jazyce Python říká funkce (v jiných programovacích jazycích se s nimi můžete setkat také pod názvem procedury nebo funkce, případně obojí). Nyní nakreslíme dům a vytvoříme k němu funkci (příkaz) dum().

import tkinter

canvas = tkinter.Canvas()
canvas.pack()

canvas.create_rectangle(100, 100, 150, 150)
canvas.create_line(100, 100, 125, 50, 150, 100)

Program nakreslí dům se střechou z obdélníku a lomené čáry. V dalším příkladu jsme si definovali vlastní funkci s názvem dum(). Funkci definujeme slovem def, za kterým následuje název funkce, pak závorky a na konci dvojtečka (stejně jako v cyklu for).

import tkinter

canvas = tkinter.Canvas()
canvas.pack()

def dum():
    canvas.create_rectangle(100, 100, 150, 150)
    canvas.create_line(100, 100, 125, 50, 150, 100)

Přesunutí příkazů od levého okraje pomůže Pythonu pochopit, co všechno patří do naší funkce. Stejné odsazení jsme použili při psaní cyklu for. Tento program po spuštění ještě nic neudělá, protože jsme pouze definovali, co bude naše funkce (náš příkaz) dělat, ale ještě jsme ji nikde nepoužili (nespustili, neprovedli, nezavolali). Výsledkem programu bude prázdné okno. Chcete-li tuto funkci spustit, zadejte v programu příkaz dum() (na místě v programu, kde se má funkce spustit).

import tkinter

canvas = tkinter.Canvas()
canvas.pack()

def dum():
    canvas.create_rectangle(100, 100, 150, 150)
    canvas.create_line(100, 100, 125, 50, 150, 100)

dum()

Tento program již provede funkci dum(). Zatím nevidíme smysl v definování vlastního příkazu, ale změňme funkci dum() tak, aby nakreslila dům na náhodném místě.

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

def dum():
    x = random.randint(100, 300)
    y = random.randint(100, 300)
    canvas.create_rectangle(x, y, x+50, y+50)
    canvas.create_line(x, y, x+25, y-50, x+50, y)

dum()
dum()
dum()

V tomto programu jsme zavolali podprogram dum() třikrát. Tím se nakreslili tři domy na náhodném místě.

Pokud bychom použili smyčku for, mohli bychom snadno nakreslit 10 domů:

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

def dum():
    x = random.randint(100, 300)
    y = random.randint(100, 300)
    canvas.create_rectangle(x, y, x+50, y+50)
    canvas.create_line(x, y, x+25, y-50, x+50, y)

for i in range(10):
    dum()

Funkci (podprogram) lze také upravit tak, abychom při jejím použití mohli zadat místo, kam chceme dům nakreslit. Podobně jako při použití funkce create_rectangle ovlivníme místo, kam se má dům nakreslit, pomocí čísel v závorkách – říkáme jim parametry nebo argumenty. Při definici funkce s parametrem uzavíráme názvy jednotlivých parametrů do závorek oddělených čárkou (pokud jich chceme mít více). Tato jména lze v naší funkci použít (jsou to vlastně jakési proměnné, které lze použít pouze v této funkci) a mají hodnotu, kterou jsme zadali při použití funkce.

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

def dum(x, y):
    canvas.create_rectangle(x, y, x+50, y+50)
    canvas.create_line(x, y, x+25, y-50, x+50, y)

dum(100, 100)
dum(180, 100)
dum(260, 100)
import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

def dum(x, y):
    canvas.create_rectangle(x, y, x+50, y+50)
    canvas.create_line(x, y, x+25, y-50, x+50, y)

for i in range(1, 7)
    dum(i*60, 100)

💾 Úkoly

Mince

Na chodníku je náhodně pohozených n mincí s hodnotami 1, 2, 5, 10, 20 a 50 Kč. Vytvořte funkci mince(n), která je nakreslí pomocí cyklu for. Mince budou mít náhodně jednu z těchto barev: white, silver nebo gold. Do terminálu se zapíše celkový součet hodnot mincí.

Domino

Vytvořte funkci domino(n), která pomocí cyklu a obdélníku nakreslí n obdélníků vedle sebe. V ukázce se volá domino(6).

Vagón

Vytvořte funkci vagon(), která nakreslí vagón na zadané místo. Funkci použijte ve smyčce for, abyste nakreslili vlak složený ze čtyř vagónů. Všimněte si pozic nárazníků:

Lokomotiva

Vytvořte funkci, která na zadaném místě nakreslí lokomotivu. Nakreslete tuto lokomotivu na začátek vlaku z předcházející úlohy:

Obličej

Vytvořte funkci oblicej(x,y,n), která na zadaných souřadnicích nakreslí “obličej” – čtvercového robota, který má oči, nos a ústa náhodné velikosti a náhodné barvy (ze seznamu definovaných barev) a zároveň je jeho tvář symetrická. Funkci využijte ve for cyklu, abyste nakreslili vedle sebe několik různých tváří (parametr n). Příklady:

Postava

Vytvořte funkci postava(x,y), která na zadaných souřadnicích nakreslí stylizovanou postavu:

Hrad

Vytvořte funkci hrad(x,y), která na zadaných souřadnicích nakreslí hrad: